/**
 * Вспомогательный класс для кодирования и декодирования текстовых строк
 * в формате Base64
 */

#ifndef _BASE64_H
#define	_BASE64_H

#include <string>
#include <cstdlib>

namespace etu {
namespace common {

class Base64 {

public:

    /**
     * Кодирование текстовой строки в формате Base64
     * @param src исходная строка, которая должна быть закодирована
     * @return исходная строка, закодированная в формате Base64
     */
    static std::string encode(const std::string& src);

    /**
     * Декодирование текстовой строки, закодированной в формате Base64.
     * В данной реализации нет проверки на то, что строка имеет недопустимый формат
     * @param encoded строка, закодированная в формате Base64
     * @return декодированная строка
     */
    static std::string decode(const std::string& encoded);
    
private:
    Base64();

    /**
     * Проверка, является ли заданный символ корректным для формата Base64
     * @param c символ
     * @return true, если символ является корректным для формата Base64; иначе false
     */
    static inline bool isBase64(unsigned char c) {
      return (isalnum(c) || (c == '+') || (c == '/'));
    }

    static const std::string base64Chars;
};

}
}

#endif	/* _BASE64_H */
